home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
Pakiet multimedia
/
Muzyka
/
Edytory sampli (probek dzwieku)
/
ZynAddSubFX_2.2.0
/
Setup_ZynAddSubFX-2.2.0.exe
/
source code
/
Params
/
EnvelopeParams.C
< prev
next >
Wrap
C/C++ Source or Header
|
2005-03-14
|
6KB
|
228 lines
/*
ZynAddSubFX - a software synthesizer
EnvelopeParams.C - Parameters for Envelope
Copyright (C) 2002-2005 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "EnvelopeParams.h"
EnvelopeParams::EnvelopeParams(unsigned char Penvstretch_,unsigned char Pforcedrelease_):Presets(){
int i;
PA_dt=10;PD_dt=10;PR_dt=10;PA_val=64;PD_val=64;PS_val=64;PR_val=64;
for (i=0;i<MAX_ENVELOPE_POINTS;i++){
Penvdt[i]=32;
Penvval[i]=64;
};
Penvdt[0]=0;//no used
Penvsustain=1;
Penvpoints=1;
Envmode=1;
Penvstretch=Penvstretch_;
Pforcedrelease=Pforcedrelease_;
Pfreemode=1;
Plinearenvelope=0;
store2defaults();
};
EnvelopeParams::~EnvelopeParams(){
};
REALTYPE EnvelopeParams::getdt(char i){
REALTYPE result=(pow(2.0,Penvdt[i]/127.0*12.0)-1.0)*10.0;//miliseconds
return(result);
};
/*
* ADSR/ASR... initialisations
*/
void EnvelopeParams::ADSRinit(char A_dt,char D_dt,char S_val,char R_dt){
setpresettype("Penvamplitude");
Envmode=1;
PA_dt=A_dt;PD_dt=D_dt;PS_val=S_val;PR_dt=R_dt;
Pfreemode=0;
converttofree();
store2defaults();
};
void EnvelopeParams::ADSRinit_dB(char A_dt,char D_dt,char S_val,char R_dt){
setpresettype("Penvamplitude");
Envmode=2;
PA_dt=A_dt;PD_dt=D_dt;PS_val=S_val;PR_dt=R_dt;
Pfreemode=0;
converttofree();
store2defaults();
};
void EnvelopeParams::ASRinit(char A_val,char A_dt,char R_val,char R_dt){
setpresettype("Penvfrequency");
Envmode=3;
PA_val=A_val;PA_dt=A_dt;PR_val=R_val;PR_dt=R_dt;
Pfreemode=0;
converttofree();
store2defaults();
};
void EnvelopeParams::ADSRinit_filter(char A_val,char A_dt,char D_val,char D_dt,char R_dt,char R_val){
setpresettype("Penvfilter");
Envmode=4;
PA_val=A_val;PA_dt=A_dt;PD_val=D_val;PD_dt=D_dt;PR_dt=R_dt;PR_val=R_val;
Pfreemode=0;
converttofree();
store2defaults();
};
void EnvelopeParams::ASRinit_bw(char A_val,char A_dt,char R_val,char R_dt){
setpresettype("Penvbandwidth");
Envmode=5;
PA_val=A_val;PA_dt=A_dt;PR_val=R_val;PR_dt=R_dt;
Pfreemode=0;
converttofree();
store2defaults();
};
/*
* Convert the Envelope to freemode
*/
void EnvelopeParams::converttofree(){
switch (Envmode){
case 1: Penvpoints=4;Penvsustain=2;
Penvval[0]=0;Penvdt[1]=PA_dt;Penvval[1]=127;
Penvdt[2]=PD_dt;Penvval[2]=PS_val;
Penvdt[3]=PR_dt;Penvval[3]=0;
break;
case 2: Penvpoints=4;Penvsustain=2;
Penvval[0]=0;Penvdt[1]=PA_dt;
Penvval[1]=127;Penvdt[2]=PD_dt;
Penvval[2]=PS_val;Penvdt[3]=PR_dt;Penvval[3]=0;
break;
case 3: Penvpoints=3;Penvsustain=1;
Penvval[0]=PA_val;Penvdt[1]=PA_dt;
Penvval[1]=64;Penvdt[2]=PR_dt;Penvval[2]=PR_val;
break;
case 4: Penvpoints=4;Penvsustain=2;
Penvval[0]=PA_val;Penvdt[1]=PA_dt;
Penvval[1]=PD_val;Penvdt[2]=PD_dt;Penvval[2]=64;
Penvdt[3]=PR_dt;Penvval[3]=PR_val;
break;
case 5: Penvpoints=3;Penvsustain=1;
Penvval[0]=PA_val;Penvdt[1]=PA_dt;
Penvval[1]=64;Penvdt[2]=PR_dt;Penvval[2]=PR_val;
break;
};
};
void EnvelopeParams::add2XML(XMLwrapper *xml){
xml->addparbool("free_mode",Pfreemode);
xml->addpar("env_points",Penvpoints);
xml->addpar("env_sustain",Penvsustain);
xml->addpar("env_stretch",Penvstretch);
xml->addparbool("forced_release",Pforcedrelease);
xml->addparbool("linear_envelope",Plinearenvelope);
xml->addpar("A_dt",PA_dt);
xml->addpar("D_dt",PD_dt);
xml->addpar("R_dt",PR_dt);
xml->addpar("A_val",PA_val);
xml->addpar("D_val",PD_val);
xml->addpar("S_val",PS_val);
xml->addpar("R_val",PR_val);
if ((Pfreemode!=0)||(!xml->minimal)){
for (int i=0;i<Penvpoints;i++){
xml->beginbranch("POINT",i);
if (i!=0) xml->addpar("dt",Penvdt[i]);
xml->addpar("val",Penvval[i]);
xml->endbranch();
};
};
};
void EnvelopeParams::getfromXML(XMLwrapper *xml){
Pfreemode=xml->getparbool("free_mode",Pfreemode);
Penvpoints=xml->getpar127("env_points",Penvpoints);
Penvsustain=xml->getpar127("env_sustain",Penvsustain);
Penvstretch=xml->getpar127("env_stretch",Penvstretch);
Pforcedrelease=xml->getparbool("forced_release",Pforcedrelease);
Plinearenvelope=xml->getparbool("linear_envelope",Plinearenvelope);
PA_dt=xml->getpar127("A_dt",PA_dt);
PD_dt=xml->getpar127("D_dt",PD_dt);
PR_dt=xml->getpar127("R_dt",PR_dt);
PA_val=xml->getpar127("A_val",PA_val);
PD_val=xml->getpar127("D_val",PD_val);
PS_val=xml->getpar127("S_val",PS_val);
PR_val=xml->getpar127("R_val",PR_val);
for (int i=0;i<Penvpoints;i++){
if (xml->enterbranch("POINT",i)==0) continue;
if (i!=0) Penvdt[i]=xml->getpar127("dt",Penvdt[i]);
Penvval[i]=xml->getpar127("val",Penvval[i]);
xml->exitbranch();
};
if (!Pfreemode) converttofree();
};
void EnvelopeParams::defaults(){
Penvstretch=Denvstretch;
Pforcedrelease=Dforcedrelease;
Plinearenvelope=Dlinearenvelope;
PA_dt=DA_dt;
PD_dt=DD_dt;
PR_dt=DR_dt;
PA_val=DA_val;
PD_val=DD_val;
PS_val=DS_val;
PR_val=DR_val;
Pfreemode=0;
converttofree();
};
void EnvelopeParams::store2defaults(){
Denvstretch=Penvstretch;
Dforcedrelease=Pforcedrelease;
Dlinearenvelope=Plinearenvelope;
DA_dt=PA_dt;
DD_dt=PD_dt;
DR_dt=PR_dt;
DA_val=PA_val;
DD_val=PD_val;
DS_val=PS_val;
DR_val=PR_val;
};